
package carmadness.model;

/**
 * A civil járművet jelképező osztály.
 * 
 * @author Metzing Arpad
 * @version 1.0
 * @created 10-Apr-2010 2:32:37 PM
 */
public class Civilian extends Vehicle
{

	/**
	 * A letrehozott példányok száma.
	 */
	private static int instances;

	private static final int targetInstanceCount = 1;

	private int currentMaxSpeed;

	/**
	 * Alapértelmezett konstruktor. Civil esetén alapból véletlenszerű
	 * útválasztást és 1 sebességet kap.
	 */
	public Civilian()
	{
		this( new RandomStrategy(), 1 );
	}

	/**
	 * Civil konstruktor.
	 * 
	 * @param _strategy
	 *            a választott döntési stratégia
	 * @param _defaultSpeed
	 *            az alapértelmezett sebesség
	 */
	public Civilian( Strategy _strategy, int _defaultSpeed )
	{
		super( _strategy );
		this.defaultSpeed = _defaultSpeed;
		this.baseWeight = 10f;
		this.weight = 10f;
		Civilian.instances++;
	}

	public static void reset()
	{
		instances = 0;
	}

	/**
	 * Másik járművel történő ütközés esetén meghívódó metódus.
	 * 
	 * @param visitor
	 *            A másik ütköző jármű
	 */
	public void accept( IVehicleVisitor visitor )
	{
		visitor.visitVehicle( this );
	}

	/**
	 * Visszatér a példányok számával.
	 * 
	 * @return a példányok száma
	 */
	public static int getInstanceCount()
	{
		return Civilian.instances;
	}

	/**
	 * Civil sebességkorlátozásnál. Beállítja a jelenlegi szakaszra érvényes
	 * maximális sebessséget.
	 * 
	 * @param rule
	 *            SpeedLimit típusú szabály.
	 */
	public void visitRule( SpeedLimit rule )
	{
		this.currentMaxSpeed = (int)rule.getValue();
	}

	/**
	 * Civil lámpás kereszteződésnél. Ha a lámpa piros, megállítja a kocsit és
	 * kinullázza a súlyát (legalacsonyabb elsőbbségi helyzet).
	 * 
	 * @param rule
	 *            TrafficLight típusú szabály.
	 */
	public void visitRule( TrafficLight rule )
	{
		if ( rule.isGreen() )
		{
			this.releaseBrake();
		}
		else
		{
			this.applyBrake();
			this.weight = 0;
		}
	}

	/**
	 * Civil stoptáblánál. A stoptábla súlyával megszorozza a kocsi súlyát.
	 * 
	 * @param rule
	 *            StopSign típusú szabály.
	 */
	public void visitRule( StopSign rule )
	{
		this.weight *= rule.getFactor();
	}

	/**
	 * Egy útelemen lévő civilbe "hátulról" beleütközött egy másik civil
	 * 
	 * @param Civilian
	 *            vehicle - a "hibás" civil
	 */
	@Override
	public void visitVehicle( Civilian vehicle )
	{
		// ILYEN ELVILEG NEM FORDULHAT ELŐ!!!
	}

	/**
	 * Egy útelemen lévő civilbe "hátulról" beleütközött egy rendőr
	 * 
	 * @param Police
	 *            vehicle - a "hibás" rendőr
	 */
	@Override
	public void visitVehicle( Police vehicle )
	{
		// ELVILEG ILYEN SEM FORDULHAT ELŐ
	}

	/**
	 * Egy útelemen lévő civilbe "hátulról" beleütközött egy rabló
	 * 
	 * @param Robber
	 *            vehicle - a rabló
	 */
	public void visitVehicle( Robber vehicle )
	{
		// Ha a rabló éppen halhatatlan, ne csökkenjen az életeinek száma
		vehicle.decreaseLives();

		// Mi mindenképp meghalunk
		this.kill();
	}

	/**
	 * A jármű megsemmisítéséről gondoskodik. Csökkenti a civil járművek
	 * nyilvántartott példányainak számát.
	 * 
	 */
	public void kill()
	{
		super.kill();
		Civilian.instances--;
	}

	/**
	 * Megadja, hogy hány civilnek kellene egyszerre a pályán tartózkodnia.
	 * 
	 * @return Megadja, hogy hány civilnek kellene egyszerre a pályán
	 *         tartózkodnia.
	 */
	public static int getTargetInstanceCount()
	{
		return targetInstanceCount;
	}

}
